 /*******************************************************************************
  * Copyright (c) 2000, 2003 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/cpl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/

 package org.eclipse.ui.internal.ide.dialogs;

 import java.io.File ;

 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.*;
 import org.eclipse.ui.dialogs.SelectionDialog;
 import org.eclipse.ui.help.WorkbenchHelp;
 import org.eclipse.ui.internal.ide.IHelpContextIds;
 import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;

 /**
  * A selection dialog which shows the path variables defined in the
  * workspace.
  * The <code>getResult</code> method returns the name(s) of the
  * selected path variable(s).
  * <p>
  * This class may be instantiated; it is not intended to be subclassed.
  * </p>
  * <p>
  * Example:
  * <pre>
  * PathVariableSelectionDialog dialog =
  * new PathVariableSelectionDialog(getShell(), IResource.FOLDER);
  * dialog.open();
  * String[] result = (String[]) dialog.getResult();
  * </pre>
  * </p>
  *
  * @since 2.1
  */
 public class PathVariableSelectionDialog extends SelectionDialog {
     private static final int EXTEND_ID = IDialogConstants.CLIENT_ID + 1;
     private PathVariablesGroup pathVariablesGroup;
     private int variableType;

 /**
  * Creates a path variable selection dialog.
  *
  * @param parentShell the parent shell
  * @param variableType the type of variables that are displayed in
  * this dialog. <code>IResource.FILE</code> and/or <code>IResource.FOLDER</code>
  * logically ORed together.
  */
 public PathVariableSelectionDialog(Shell parentShell, int variableType) {
     super(parentShell);
     setTitle(IDEWorkbenchMessages.getString("PathVariableSelectionDialog.title")); //$NON-NLS-1$
 this.variableType = variableType;
     pathVariablesGroup = new PathVariablesGroup(
         false,
         variableType,
         new Listener() {
             public void handleEvent(Event event) {
                 updateExtendButtonState();
             }
         }
     );
     setShellStyle(getShellStyle() | SWT.RESIZE);
 }
 /**
  * Handles an "Extend" button press.
  *
  * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
  */
 protected void buttonPressed(int buttonId) {
     if (buttonId == EXTEND_ID) {
         FileFolderSelectionDialog dialog = new FileFolderSelectionDialog(getShell(), false, variableType);
         PathVariablesGroup.PathVariableElement selection = pathVariablesGroup.getSelection()[0];
         dialog.setTitle(IDEWorkbenchMessages.getString("PathVariableSelectionDialog.ExtensionDialog.title")); //$NON-NLS-1$
 dialog.setMessage(IDEWorkbenchMessages.format("PathVariableSelectionDialog.ExtensionDialog.description", new Object [] {selection.name})); //$NON-NLS-1$
 dialog.setInput(selection.path.toFile());
         if (dialog.open() == FileFolderSelectionDialog.OK && pathVariablesGroup.performOk()) {
             setExtensionResult(selection, (File ) dialog.getResult()[0]);
             super.okPressed();
         }
     }
     else
         super.buttonPressed(buttonId);
 }
 /* (non-Javadoc)
  * Method declared in Window.
  */
 protected void configureShell(Shell shell) {
     super.configureShell(shell);
     WorkbenchHelp.setHelp(shell, IHelpContextIds.PATH_VARIABLE_SELECTION_DIALOG);
 }
 /**
  * Adds an Extend button in addition to OK, Cancel.
  *
  * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(Composite)
  */
 protected void createButtonsForButtonBar(Composite parent) {
     createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
     createButton(parent, EXTEND_ID, IDEWorkbenchMessages.getString("PathVariableSelectionDialog.extendButton"), false);//$NON-NLS-1$
 createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
     updateExtendButtonState();
 }
 /* (non-Javadoc)
  * Method declared on Dialog.
  */
 protected Control createDialogArea(Composite parent) {
     // create composite
 Composite dialogArea = (Composite)super.createDialogArea(parent);

     pathVariablesGroup.createContents(dialogArea);
     return dialogArea;
 }
 /**
  * Disposes the path variables group.
  * @see org.eclipse.jface.window.Window#close()
  */
 public boolean close() {
     pathVariablesGroup.dispose();
     return super.close();
 }
 /**
  * Sets the dialog result to the selected path variable name(s).
  */
 protected void okPressed() {
     if (pathVariablesGroup.performOk()) {
         PathVariablesGroup.PathVariableElement[] selection = pathVariablesGroup.getSelection();
         String [] variableNames = new String [selection.length];
         
         for (int i = 0; i < selection.length; i++)
             variableNames[i] = selection[i].name;
         setSelectionResult(variableNames);
     }
     else {
         setSelectionResult(null);
     }
     super.okPressed();
 }
 /**
  * Sets the dialog result to the concatenated variable name and extension.
  *
  * @param variable variable selected in the variables list and extended
  * by <code>extensionFile</code>
  * @param extensionFile file selected to extend the variable.
  */
 private void setExtensionResult(PathVariablesGroup.PathVariableElement variable, File extensionFile) {
     IPath extensionPath = new Path(extensionFile.getPath());
     int matchCount = extensionPath.matchingFirstSegments(variable.path);
     IPath resultPath = new Path(variable.name);
         
     extensionPath = extensionPath.removeFirstSegments(matchCount);
     resultPath = resultPath.append(extensionPath);
     setSelectionResult(new String [] {resultPath.toOSString()});
 }
 /**
  * Updates the enabled state of the Extend button based on the
  * current variable selection.
  */
 protected void updateExtendButtonState() {
     PathVariablesGroup.PathVariableElement[] selection = pathVariablesGroup.getSelection();
     Button extendButton = getButton(EXTEND_ID);
     
     if (extendButton == null)
         return;
     if (selection.length == 1) {
         File file = selection[0].path.toFile();
         if (file.exists() == false || file.isFile())
             extendButton.setEnabled(false);
         else
             extendButton.setEnabled(true);
     }
     else
         extendButton.setEnabled(false);
 }

 }

